// 此文件主要是用来写spu和sku逻辑的，商品的规格选项
import bwPowerSet from '@/vender/power-set'
// 分隔符定义
const spliter = '★'
// 得到一个路径字典对象，
const getPathMap = (skus) => {
  // 1. 得到所有的sku 集合  props.goods.skus
  // 2. 从所有的sku中筛选出有效的sku
  // 3. 根据有效的sku使用power-set算法得到子集
  // 4. 根据子集往路径字典中存子集
  const pathMap = {}
  skus.forEach((sku) => {
    // 筛选出有效的sku，库存>0
    if (sku.inventory > 0) {
      // 2.计算当前有库存的sku子集
      // 例如 [1,2,3] ==> [[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]
      // 由于数据中的specs 是一个数组，数组中的元素是对象，{name: "颜色", valueName: "白色-FRUITS"},并不是基本类型，所以需要提取出需要的信息,[白色-FRUITS]
      // 可选值数组
      const valueArr = sku.specs.map((val) => val.valueName)
      // 3.可选值数组子集
      const valueArrPowerSet = bwPowerSet(valueArr)
      // 遍历子集，往pathMap插入数据
      valueArrPowerSet.forEach((arr) => {
        // 根据arr得到字符串的key，约定key是:['蓝色','美国'] === '蓝色★美国'
        const key = arr.join(spliter)
        // 给pathMap设置数据  如果有这个数据
        if (pathMap[key]) {
          pathMap[key].push(sku.id)
        } else {
          // 为什么存的是id，因为sku就相当于选项的组合,id可以区别组合出来的是什么东西，假如 [a1,b1]是100,[a1,b2]就是102
          pathMap[key] = [sku.id]
        }
      })
    }
  })
  return pathMap
}

// 获取当前选中的数据的集合,点击商品规格选项的时候，获取到对应的商品
const getSelectedArr = (specs) => {
  const selectedArr = []
  specs.forEach((spec) => {
    // 选中的按钮对象
    const selectedVal = spec.values.find((val) => val.isSelected)
    selectedArr.push(selectedVal ? selectedVal.name : undefined)
  })
  return selectedArr
}

// 更新按钮禁用状态
const updateDisabledStatus = (specs, pathMap) => {
  // 获取到商品的规格之后应该做什么？  约定每一个按钮的状态由本身的disabled来控制
  specs.forEach((spec, i) => {
    const selectedArr = getSelectedArr(specs)
    // 去路径字典中查找是否有数据,有就点击,没有就禁用
    spec.values.forEach((val) => {
      // 判断是否选中,如果已经选中,就不用在判断
      if (val.isSelected) return
      // 拿当前的值按照顺序套入选中的值的数组
      selectedArr[i] = val.name
      // 剔除undefined数据,按照分割符拼接key
      const key = selectedArr.filter((item) => item).join(spliter)
      // 拿着key去路径字典中查找是否有数据,有可以点击,没有就禁用(true)
      val.disabled = !pathMap[key]
    })
  })
}

export { spliter, getPathMap, updateDisabledStatus, getSelectedArr }
